﻿#define _CRT_SECURE_NO_WARNINGS  1
//一定要动手，例子不管多么简单，建议至少自己手敲一遍看看是否理解了里头的细枝末节。
//一定要学会思考，思考为什么要这样，而不是那样。还要举一反三地思考
//#include<stdio.h>
//#include<ctype.h>
//#include<limits.h>
//#include<assert.h>
//enum status
//{
//	VALID,
//	INVALID,
//}status = INVALID;//初始化为非法
//int IsDigit(char* p)
//{
//
//}
//int my_atoi(char* str)
//{
//	int flag = 1;//记录符号位
//	//检查str是否为空指针
//	assert(str);
//	//空字符串问题
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	//空字符问题
//	while (*str == ' ')
//	{
//		str++;
//	}
//	//+-号问题
//	if (*str == '+')
//	{
//		flag = +1;
//		str++;
//	}
//	if (*str == '-')
//	{
//		flag = -1;
//		str++;
//	}
//	long long n = 0;
//	while (*str != '\0')
//	{
//		//不是数字问题
//		if (isdigit(*str))
//		{
//			n = n * 10 + (*str - '0');
//			//溢出问题
//			if (n > INT_MAX)
//			{
//				return INT_MAX;
//				break;
//			}
//			if (n < INT_MIN)
//			{
//				return INT_MIN;
//				break;
//			}
//		}
//		else {
//			break;//如果不是数字字符，直接跳出循环  status此时还是INVALID
//		}
//		str++;
//	}
//	if (*str == '\0')
//	{
//		status = VALID;//走到\0说明是合法转化
//	}
//	n *= flag;
//	return (int)n;//强制转换为int 类型
//}
//int main()
//{
//	int n;
//	char* str = "    -123a45";
//	n = my_atoi(str);
//	if (status == VALID)
//	{
//		printf("合法转换：n = %d\n", n);
//	}
//	else
//	{
//		printf("非法转换：n = %d\n", n);
//	}
//	return 0;
//}
//#include<stdio.h>
//#include<ctype.h>
//#include<limits.h>
//#include<assert.h>
//enum status {
//	LEGAL,
//	ILLEGAL,
//}status = ILLEGAL;
//int my_atoi(char* p)
//{
//	int flag = 1;
//	//空指针问题
//	assert(p);
//	//空字符串问题
//	if (*p == '\0')
//	{
//		return 0;
//	}
//	//空号问题
//	while (*p == ' ')
//	{
//		p++;
//	}
//	//正负号问题
//	if (*p == '-')
//	{
//		flag = -1;
//		p++;
//	}
//	if (*p == '+')
//	{
//		p++;
//	}
//	long long  n = 0;
//	//非数字字符问题
//	while (*p)
//	{
//		if (isdigit(*p))
//		{
//			n = n * 10 + (*p - '0');
//			//溢出问题
//			if (n > INT_MAX)
//			{
//				return INT_MAX;
//			}
//			else if (n < INT_MIN)
//			{
//				return INT_MIN;
//			}
//		}
//		else
//		{
//			break;
//		}
//		p++;
//	}
//	if (*p == '\0')
//	{
//		status = LEGAL;
//	}
//	n *= flag;
//	return (int)n;
//}
//int main()
//{
//	char* arr = "   12345a678";
//	int ret = my_atoi(arr);
//	if (status==LEGAL)
//	{
//		printf("合法输出：%d", ret);
//	}
//	else
//	{
//		printf("非法输出：%d", ret);
//	}
//	return 0;
//}
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int * p = (int *)malloc(20);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	for (int i = 0; i < 5; i++)
//	{
//		p[i] = i;
//		printf("%d\n", p[i]);
//	}
//	int* p2 = realloc(p, 40);
//	if (p2 == NULL)
//	{
//		perror("realloc");
//		return 1;
//	}
//	for (int j = 0; j < 10; j++)
//	{
//		printf("%d\n", p2[j]);
//	}
//	free(p2);
//	p2 = NULL;
//	return 0;
//}
//#include<stdio.h>
//#include<limits.h>>
//int main()
//{
//	int* p = (int*)malloc(INT_MAX / 4);
//	*p = 20;//如果P的值是NULL,就会发生错误   应在每次开辟空间后检查一下返回值是否为NULL;
//	free(p);
//	p = NULL;
//	return 0;
//}
//#include<stdio.h>
//#include<limits.h>>
//int main()
//{
//	int i = 0;
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	for (i = 0; i <= 10; i++)
//	{
//		*(p + i) = i;//当i是10时访问越界
//	}
//	free(p);
//	p = NULL;
//}

//#include<stdio.h>
//#include<limits.h>>
//int main()
//{
//	int a = 10;
//	int* p = &a;
//	free(p);  //错误只有动态开辟的空间才能使用free来释放
//	return 0;
//}
//#include<stdio.h>
//#include<limits.h>>
//int main()
//{
//	int* p = (int*)malloc(100);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	free(p);
//	free(p);  //错误，对同一块内存进行多次释放
//	//p++;
//	//free(p);
//	//p = NULL;//错误  此时p不在指向动态内存的起始位置
//
//}
//#include<stdio.h>
//int main()
//{
//	int* p = (int*)malloc(40);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	*p = 20;
//	//    错误没有对动态开辟的空间进行释放  会造成内存泄露
//	return 0;
//
//}
//#include<stdio.h>
//#include<math.h>
//int main()
//{
//    int n = 0;
//    scanf("%d",&n);
//    int ret = sqrt(n);
//    for (int i = ret; i < n; i++)
//    {
//        for (int j = ret; j > 0; j--)
//        {
//            if (j * i == n)
//            {
//                printf("%d %d\n", j, i);
//            }
//        }
//    }
//    return 0;
//} 